home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************
- * DCfile.c: ファイル読み込み処理
- ******************************************************************************
- *
- *
- */
- #include <sxdef2.h>
- #include <stdio.h>
- #include <jfctype.h>
- #include <stdlib.h>
- #include <string.h>
- #include <io.h>
- #include <jfctype.h>
- #include <doslib.h>
- #include <event.h> /* イベントマンを利用するときに必要 */
- #include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
- #include <window.h> /* ウィンドウマンを利用するときに必要 */
- #include <control.h> /* コントロールマンを利用するときに必要 */
- #include <dialog.h> /* ダイアログマンを利用するときに必要 */
- #include <task.h> /* タスクマンを利用するときに必要 */
- #include "DC.h" /* このプログラム固有のヘッダファイル */
-
- /******************************************************************************
- * GetData(): データ読み込み
- ******************************************************************************
- * 引数: ComVal *pcv 共通変数へのポインタ
- * char *pname ファイル名(フルパス)
- */
- int GetData(ComVal *pcv, char *pname)
- {
- FILE *fn;
- int i,cutOk,cache_flag=0;
- long fileLen, line;
- char **data;
- void **dmy1;
-
- Graph *lastGraph;
- Dialog *dialogPtr;
- int lastBC;
-
- int cut;
- char *Pt;
-
- fn = fopen(pname, "rb");
- if (fn == NULL) {
- pcv->errorCode = -2;
- DMError(D_CONFIRM,pname);
- DMError(D_CONFIRM,"ファイルが見つかりません");
- return(0);
- }
-
- fseek(fn, 0L, SEEK_END);
- fileLen = ftell(fn); /* ファイルサイズを求める */
- fseek(fn, 0L, SEEK_SET);
-
- dmy1 = NULL;
- dmy1 = MMChHdlNew((fileLen*3)/2 + 1024 + 1);
-
- if (dmy1 == NULL) { /* メモリが確保できる? */
- DMError(D_CONFIRM | D_RED, "メモリが確保できません");
- fclose(fn);
- return(0);
- }
- MMHdlDispose(dmy1);
-
-
- EMEnCross(); /* マウスポインタアニメーション開始 */
-
- if (pcv->loadFlag)
- GMDisposeRgn(pcv->updateRgnHdl);
- pcv->updateRgnHdl = GMNewRgn();
-
- /* 97.04.29 */
- /* テキストメモリ確保 */
- line = fileLen / 2;
- if (pcv->fcache) {
- if (pcv->fcache_d[pcv->depth] < 0) {
-
- pcv->txt_cache[pcv->depth] = MMChHdlNew(fileLen + 32);
- pcv->txtNo_cache[pcv->depth] = MMChHdlNew(line + 1024); /* 行ポインタ確保 */
-
- MMHdlLock(pcv->txt_cache[pcv->depth]);
- fread(*(pcv->txt_cache[pcv->depth]), sizeof(char), (size_t) (fileLen), fn);
- MMHdlUnlock(pcv->txt_cache[pcv->depth]);
- pcv->fcache_d[pcv->depth] = 1;
- cache_flag = 0;
- } else {
- if (pcv->loadFlag && (pcv->depth > 0)) {
- MMHdlDispose(pcv->txt_cache[pcv->depth]);
- MMHdlDispose(pcv->txtNo_cache[pcv->depth]);
- }
- pcv->fcache_d[pcv->depth] = -1;
- pcv->depth--;
- cache_flag = 1;
- }
- pcv->txt = pcv->txt_cache[pcv->depth];
- pcv->txtNo = pcv->txtNo_cache[pcv->depth];
- pcv->depth++;
- } else {
- if (pcv->loadFlag) {
- MMHdlDispose(pcv->txt);
- MMHdlDispose(pcv->txtNo);
- }
-
- pcv->txt = MMChHdlNew(fileLen + 32);
- pcv->txtNo = MMChHdlNew(line + 1024); /* 行ポインタ確保 */
-
- MMHdlLock(pcv->txt);
- fread(*(pcv->txt), sizeof(char), (size_t) (fileLen), fn);
- MMHdlUnlock(pcv->txt);
- dispoBits(pcv);
- cache_flag = 0;
- }
-
- fclose(fn);
-
- pcv->loadFlag = 1;
- pcv->file_size = fileLen;
- pcv->status = 0;
- strcpy(pcv->currentFname, pname);
- chkdrv(pcv); /* ドライブパスのチェック */
- setWinOpt(pcv, fileLen); /* ウィンドウオプション設定 */
-
- MMHdlLock(pcv->txt);
- Pt = *pcv->txt;
- cut = 0;
- for(i=0;i<fileLen;i++) {
- if (!strncmp(Pt++, "%CUT:", 5))
- cut++;
- }
-
- MMHdlUnlock(pcv->txt);
- dialogPtr = NULL;
- if ((fileLen > 20480 || cut > 1) && !cache_flag) /* プログレスバーの表示 */
- dialogPtr = TSReferDM(133, NULL, W_FRONT);
- if (dialogPtr == NULL) /* 作成できなかった */
- pcv->pgb = 0;
- else
- pcv->pgb = 1;
-
- if (pcv->pgb) {
- /* ダイアログ内を描画する */
- GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
- WMMove(&dialogPtr->window,
- GMLocalToGlobal(LONGWORD(pcv->fontS[pcv->font] * 97 / 4 - 130,
- pcv->fontS[pcv->font] * 30 / 2 - 45)), FALSE);
- WMShow(&dialogPtr->window);
- lastGraph = GMGetGraph(); /* カレントグラフを退避する */
- /* ダイアログをカレントグラフにする */
- GMSetGraph(&dialogPtr->window.graph);
- /* タイトルを描画する */
- GMShadowStrZ("しばらくお待ち下さい", LONGWORD(70, 24));
- lastBC = GMBackColor(G_LGRAY); /* バックグラウンドカラーを明灰にする */
- DMDraw(dialogPtr); /* すべてのアイテムを描画する */
- }
-
- pcv->cutNo[pcv->depth] = 1;
- if (cache_flag) {
- cutOk = 1;
- pcv->Maxline = pcv->Maxline_cache[pcv->depth - 1];
- pcv->depth++;
- dispoBits(pcv);
- pcv->depth--;
- } else {
- dispoBits(pcv);
- cutOk = processText(pcv, dialogPtr); /* テキストの整理 */
- pcv->Maxline_cache[pcv->depth - 1] = pcv->Maxline;
- }
-
- if (pcv->pgb) {
- GMBackColor(lastBC); /* バックグラウンドカラーを元に戻す */
- DMDispose(dialogPtr); /* ダイアログを廃棄する */
- GMSetGraph(lastGraph); /* カレントグラフを元に戻す */
- }
-
- CMMaxSet(pcv->volHdl, pcv->Maxline - 29);
- EMDeCross(); /* マウスポインタをもとに戻す */
- if (!cutOk && pcv->cutDisp)
- DMError(D_CONFIRM,
- "一部あるいは全部の\rCUTファイルの読み込みに失敗しました");
- return(1);
- }
-
- /******************************************************************************
- * processText(): テキストの整理
- ******************************************************************************
- * 引数: ComVal *pcv 共通変数へのポインタ
- */
- int processText(ComVal *pcv, Dialog *dialogPtr)
- {
- int i,ii,jj,j,k,tb,vw,line_end,esc,cut_lno,cutOk;
- int word_count,line_count,txt_end;
- int pat1,pat2;
- int zen;
- char cutfname[90];
- char dmyfname[90];
- char buff[90];
- char *txtPt,*txtTop,*txtBuf;
- int *txtNo;
- Rect rc = { 0, 0, 588, 382};
- char drv[90], path[90], node[90], ext[90];
- int cur_pos = 0;
- char tt[90];
- char *lastPt;
- int step;
- char cutfname_buff[90][90];
- int cutcount,cc,much;
-
- cutcount = 1;
- for(cc=0;cc<90;cc++)
- strcpy(&cutfname_buff[cc][0], "");
-
- MMHdlLock(pcv->txt); /* テキストブロックのハンドルをロック */
- MMHdlLock(pcv->txtNo);
-
- txtPt = *(pcv->txt);
- txtNo = *(pcv->txtNo);
- txtTop = txtPt;
-
- line_count = 0;
- *txtNo = 0;
- if (pcv->cutDisp)
- cutOk = 1;
- else
- cutOk = 0;
-
- if (pcv->pgb) {
- GMPenSize(LONGWORD(1,15));
- GMMove(LONGWORD(30,48));
- lastPt = txtPt;
- step = pcv->file_size / 10;
- GMForeColor(G_BLACK);
- }
-
- while(1) {
- if (pcv->pgb && (step < (txtPt - lastPt))) {
- GMSetGraph(&dialogPtr->window.graph);
- GMLineRel(LONGWORD(20,0));
- lastPt = txtPt;
- }
-
- j = 0;
- jj = 0;
- vw = 0;
- *(txtNo + line_count) = txtPt - txtTop;
- txt_end = 0;
- zen = 1;
- while(1) {
- if (*txtPt == 26 || *txtPt == 0) { /* EOF */
- *txtPt = 0;
- txt_end = 1;
- break;
- }
-
- if (*txtPt == 13) { /* 改行処理 */
- txtPt++;
- break;
- }
-
- if (*txtPt == 10) { /* LF処理 */
- *(txtNo + line_count) = *(txtNo + line_count) + 1;
- txtPt++;
- continue;
- }
-
- if (*txtPt == 9) { /* TAB処理 */
- tb = 8 - (jj % 8);
- j = 0;
- jj = jj + tb;
- txtPt++;
- zen = 0;
- continue;
- }
-
- if (*txtPt == 27) { /* esc文字属性 */
- if (*(txtPt+1) == '[') {
- esc = 0;
- txtPt = txtPt + 2;
- while(*txtPt != 'm') {
- txtPt++;
- }
- txtPt++;
- continue;
- }
- }
-
- if (jj == 94) { /* 行の折り返し */
- if (adjust(txtPt))
- txtPt += 2;
- if (*txtPt == 13)
- txtPt++;
- break;
- }
- if (jj > 94) {
- break;
- }
-
- pat1 = (int)*txtPt & 0xff;
- if (iskanji(pat1)) { /* 漢字 */
- txtPt += 2;
- jj += 2;
- continue;
- }
-
- if (*txtPt == '%') { /* %コード処理 */
- if (*(txtPt + 1) == 'V') { /* 倍角設定 */
- vw = 1;
- txtPt = txtPt + 4;
- j = 0;
- continue;
- }
- if ((*(txtPt + 1) == 'C' && cutOk && pcv->cutNo[pcv->depth] < MAX_CUTS)) {
- if (*(txtPt + 4) == ':') { /* カットファイル*/
- txtBuf = txtPt;
- txtPt = txtPt + 5;
- while(!(isalnmkana((int)*txtPt)) && *txtPt != '\\') {
- txtPt++;
- }
- for(i=0;i<90;i++) {
- if (*txtPt == '.')
- break;
- dmyfname[i] = *txtPt++;
- }
- for(ii=i;ii<i+4;ii++) {
- dmyfname[ii] = *txtPt++;
- }
- dmyfname[ii] = 0;
-
- if (*dmyfname == '\\') {
- if (!strncmp(pcv->currentFname,pcv->a_drv, strlen(pcv->a_drv)))
- sprintf(buff, "A:%s", dmyfname);
- else
- sprintf(buff, "B:%s", dmyfname);
-
- structfname(pcv, "", buff, cutfname);
- } else {
- strsfn(pcv->currentFname, drv, path, node, ext);
- sprintf(cutfname, "%s%s\\%s", drv, path,dmyfname);
- }
-
- much = 0;
- if (cutcount > 1) {
- for(cc=1;cc<cutcount;cc++) {
- if (!strcmp(cutfname,&cutfname_buff[cc][0])) {
- much = 1;
- break;
- }
- }
- }
- if (much > 0) {
- cut_lno = '0';
- *(txtBuf+2) = '0'+(char)cc;
- *(txtBuf+3) = cut_lno;
- cutOk = 1;
- continue;
- } else {
- if (!cut(pcv, cutfname)) {
- cutOk = 0;
- } else {
- cut_lno = '0';
- *(txtBuf+2) = '0'+(char)cutcount;
- *(txtBuf+3) = cut_lno;
- cc = cutcount;
- strcpy(&cutfname_buff[cutcount++][0], cutfname);
- cutOk = 1;
- continue;
- }
- }
- } else if (cutOk) {
- *(txtPt+2) = '0' + (char)cc;
- *(txtPt+3) = ++cut_lno;
- }
- }
- }
-
- if (*txtPt == 24) { /* 倍角解除 */
- if (vw == 1) {
- vw = 0;
- j = 0;
- continue;
- }
- txtPt++;
- continue;
- }
-
- txtPt++;
- jj++;
- }
-
- if (txt_end) break;
- if ((txtPt - txtTop + 1) >= pcv->file_size) break;
- line_count++;
- }
- if (pcv->pgb) {
- GMSetGraph(&dialogPtr->window.graph);
- GMLine(LONGWORD(230,48));
- }
-
- pcv->Maxline = line_count;
- if (pcv->normal)
- pcv->ofset = 0;
- else
- pcv->normal = 1;
- MMHdlUnlock(pcv->txtNo); /* テキストブロックのハンドルをアンロック */
- MMHdlUnlock(pcv->txt);
- return(cutOk);
- }
-
- /******************************************************************************
- * setWinOpt(): ウィンドウ設定
- ******************************************************************************
- * 引数: ComVal *pcv 共通変数へのポインタ
- */
- void setWinOpt(ComVal *pcv, int fileLen)
- {
- LASCII wTitle;
- char name[90],node[90],ext[5];
- Task mytask;
- size_t len;
- char *txtPt,*ttPt,*tePt,*tt2Pt;
- int i, flag1 = 1, flag2 = 1;
-
- strcpy(name, pcv->currentFname);
- stcgfn(node, name);
- if (strcmp(node, "MOKUJI") == 0) {
- MMHdlLock(pcv->txt);
- txtPt = *(pcv->txt);
- ttPt = NULL;
- tt2Pt = NULL;
- for (i=0;i<fileLen - 10;i++) {
- txtPt++;
-
- if (flag1 && !strncmp(txtPt,"\r\n電脳倶楽部 ", 14)) {
- ttPt = txtPt + 2;
- flag1 = 0;
- }
- if (flag2 && !strncmp(txtPt,"・自由軟盤", 10)) {
- tt2Pt = txtPt + 2;
- flag2 = 0;
- }
- if (!flag1 && !flag2)
- break;
- }
- MMHdlUnlock(pcv->txt);
- if (!flag1) {
- tePt = strstr(ttPt, "(");
- strncpy(pcv->title, ttPt, tePt - ttPt);
- pcv->title[tePt - ttPt] = 0;
- } else if (!flag2) {
- tePt = strstr(tt2Pt, "(");
- strncpy(pcv->title, tt2Pt, tePt - tt2Pt);
- pcv->title[tePt - tt2Pt] = 0;
- } else {
- strcpy(pcv->title, "電脳倶楽部");
- }
- }
-
- len = strlen(pcv->currentFname);
-
- /* ファイル名の変更があったのでタスク管理レコードに設定
- (タスク起動チェックに必要)*/
- TSGetTdb(&mytask, TS_OWN);
- mytask.command[0] = len;
- strncpy((char *) &mytask.command[1], pcv->currentFname, len);
- TSSetTdb(&mytask, TS_OWN);
-
- stcgfn(name, pcv->currentFname);
- stcgfe(ext, pcv->currentFname);
- wTitle[0] = sprintf((char *) &wTitle[1], "%s [%s.%s]",pcv->title,name,ext);
- WMTitleSet(pcv->windowPtr, wTitle);
- }
-
- /******************************************************************************
- * chkdrv(): ドライブパス設定
- ******************************************************************************
- * 引数: ComVal *pcv 共通変数へのポインタ
- */
- void chkdrv(ComVal *pcv)
- {
- char name[256], node[256], try_a[236], drv[90], path[90], ext[5];
- int i, pat = 0;
- LASCII wTitle;
- Task mytask;
- size_t len;
-
- strcpy(name, pcv->currentFname);
- strsfn(name, drv, path, node, ext);
-
- if (!strncmp(ext, "DCV", 3)) {
- strcpy(pcv->title, "DC_VIEW");
- len = strlen(pcv->currentFname);
- TSGetTdb(&mytask, TS_OWN);
- mytask.command[0] = len;
- strncpy((char *) &mytask.command[1], pcv->currentFname, len);
- TSSetTdb(&mytask, TS_OWN);
-
- wTitle[0] = sprintf((char *) &wTitle[1], "%s [%s.%s]",pcv->title,name,ext);
- WMTitleSet(pcv->windowPtr, wTitle);
- return;
- }
-
- if (strncmp(node, "MOKUJI", 6))
- return;
-
- pcv->mloadFlag = 0;
-
- stoupper(name);
- for(i=0;i<strlen(name);i++) {
- if (!strncmp(&name[i], "QS", 2) ||
- !strncmp(&name[i], "QUICKSTART", 2)) {
- pat = 1;
- break;
- }
- }
- if (!pat) {
- for(i=0;i<strlen(name);i++) {
- if (!strncmp(&name[i], "\\M", 2)) {
- i++;
- pat = 1;
- break;
- }
- }
- }
- if (!pat)
- return;
-
- strsfn(pcv->currentFname, drv, path, node, ext); /* カレントパス設定 */
- sprintf(pcv->currentPath, "%s%s\\", drv, path);
-
- strncpy(try_a, name, i - 1); /* 仮想A:ドライブパス設定 */
- try_a[i-1] = 0;
- strcpy(pcv->a_drv, try_a);
-
- if (pcv->set_as_a) {
- strcpy(pcv->b_drv, pcv->a_drv);
- strcpy(pcv->c_drv, pcv->a_drv);
- return;
- }
-
-
- if (try_a[2] != '\\') { /* 仮想B:ドライブパス設定 */
- try_a[0] = try_a[0] + 1;
- strcpy(pcv->c_drv, try_a);
- try_a[0] = try_a[0] + 1;
- strcpy(pcv->c_drv, try_a);
- return;
- }
-
- if (try_a[i-2] == '1') {
- try_a[i-2] = '2';
- } else if ((try_a[i-2] == 'a') || (try_a[i-2] == 'A')) {
- try_a[i-2] = 'B';
- } else {
- return;
- }
- strcpy(pcv->b_drv, try_a);
-
- if (try_a[i-2] == '2') { /* 仮想C:ドライブパス設定 */
- try_a[i-2] = '3';
- } else if ((try_a[i-2] == 'b') || (try_a[i-2] == 'B')) {
- try_a[i-2] = 'C';
- } else {
- return;
- }
- strcpy(pcv->c_drv, try_a);
- }
-
- /******************************************************************************
- * stoupper(): strupr
- ******************************************************************************
- * 引数: ComVal *pcv 共通変数へのポインタ
- */
- char *stoupper(char *txt)
- {
- int i,len,str;
- char *buff;
-
- len = strlen(txt);
- buff = txt;
- for(i=0;i<len;i++) {
- str = ((int)*txt << 8) + (int)*(txt + 1);
- if(jiszen(str)) {
- txt += 2;
- i++;
- continue;
- }
- if(islower(*txt))
- *txt = (char)toupper(*txt);
- txt++;
- }
- return(buff);
- }
- STR@ 8 EdEV 3.00 <